/**
 * 前端js库: IMU 1.0
 * Copyright(c) 2013 IMU-JS
 * iduosi@gmail.com
 * imu.com
 */

var Imu = {version: '1.0'};

// 兼容过早版本浏览器
window["undefined"] = window["undefined"];

/**
 * @class Imu
 * @content Imu核心工具和方法
 * @singleton
 */

/**
 * @content 将config对象属性传递给obj对象，如果存在defaults即时对象，则把即时对象属性传递给obj
 * @param {object} obj 属性接受者
 * @param {object} config 属性传递者
 * @param {object} default 即时对象
 */
Imu.apply = function (obj, config, defaults) {
    if (defaults) {
		Imu.apply(obj, defaults);
    }
    if (obj && config && typeof config === 'object') {
		for (var i in config) {
			obj[i] = config[i];
		}
    }
    return obj;
};
/**
 * @content 命名空间实现
 * @param {string} module 模块
 * @return {object} obj 返回声明的模块对象
 */
Imu.namespace = function (module) {
	if (typeof module !== 'string') {
		alert('namespace failure');
		return;
	}
	var part = module.split('.'),
		parent = Imu,
		i = 0;
	
	// 如果第一个模块是Imu，则剥离
	if (part[0] === 'Imu') {
		part = part.slice(1);
	}
	for (; i < part.length; i++) {
		if (typeof parent[part[i]] === 'undefined') {
			parent[part[i]] = {};
		}
		parent = parent[part[i]];
	}
	return parent;
};

(function () {
    var idSeed = 100,
		userAgent =  navigator.userAgent.toLowerCase(),
		check = function(regex){
            return regex.test(userAgent);
        },
        isStrict = document.compatMode == "CSS1Compat",
        version = function (is, regex) {
            var m;
            return (is && (m = regex.exec(userAgent))) ? parseFloat(m[1]) : 0;
        },
        docMode = document.documentMode,
        isOpera = check(/opera/),
        isOpera10_5 = isOpera && check(/version\/10\.5/),
        isChrome = check(/\bchrome\b/),
        isWebKit = check(/webkit/),
        isSafari = !isChrome && check(/safari/),
        isSafari2 = isSafari && check(/applewebkit\/4/), // unique to Safari 2
        isSafari3 = isSafari && check(/version\/3/),
        isSafari4 = isSafari && check(/version\/4/),
        isSafari5_0 = isSafari && check(/version\/5\.0/),
        isSafari5 = isSafari && check(/version\/5/),
        isIE = !isOpera && check(/msie/),
        isIE7 = isIE && ((check(/msie 7/) && docMode != 8 && docMode != 9) || docMode == 7),
        isIE8 = isIE && ((check(/msie 8/) && docMode != 7 && docMode != 9) || docMode == 8),
        isIE9 = isIE && ((check(/msie 9/) && docMode != 7 && docMode != 8) || docMode == 9),
        isIE6 = isIE && check(/msie 6/),
        isGecko = !isWebKit && check(/gecko/),
        isGecko3 = isGecko && check(/rv:1\.9/),
        isGecko4 = isGecko && check(/rv:2\.0/),
        isGecko5 = isGecko && check(/rv:5\./),
        isGecko10 = isGecko && check(/rv:10\./),
        isFF3_0 = isGecko3 && check(/rv:1\.9\.0/),
        isFF3_5 = isGecko3 && check(/rv:1\.9\.1/),
        isFF3_6 = isGecko3 && check(/rv:1\.9\.2/),
        isWindows = check(/windows|win32/),
        isMac = check(/macintosh|mac os x/),
        isLinux = check(/linux/),
        scrollbarSize = null,
        chromeVersion = version(true, /\bchrome\/(\d+\.\d+)/),
        firefoxVersion = version(true, /\bfirefox\/(\d+\.\d+)/),
        ieVersion = version(isIE, /msie (\d+\.\d+)/),
        operaVersion = version(isOpera, /version\/(\d+\.\d+)/),
        safariVersion = version(isSafari, /version\/(\d+\.\d+)/),
        webKitVersion = version(isWebKit, /webkit\/(\d+\.\d+)/),
        isSecure = /^https/i.test(window.location.protocol),
        nullLog;
		
		Imu.apply(Imu, {
			isStrict: isStrict,

			isIEQuirks: isIE && !isStrict,

			/**
			 * 是否是Opera浏览器
			 * @type Boolean
			 */
			isOpera : isOpera,

			/**
			 * 是否是Opera 10.5系列版本
			 * @type Boolean
			 */
			isOpera10_5 : isOpera10_5,

			/**
			 * 是否是基于WebKit引擎的浏览器
			 * @type Boolean
			 */
			isWebKit : isWebKit,

			/**
			 * 是否是谷歌浏览器
			 * @type Boolean
			 */
			isChrome : isChrome,

			/**
			 * 是否是Safari浏览器
			 * @type Boolean
			 */
			isSafari : isSafari,

			/**
			 * 是否是Safari 3.x系列浏览器
			 * @type Boolean
			 */
			isSafari3 : isSafari3,

			/**
			 * 是否是Safari 4.x系列浏览器
			 * @type Boolean
			 */
			isSafari4 : isSafari4,

			/**
			 * 是否是Safari 5.x系列浏览器
			 * @type Boolean
			 */
			isSafari5 : isSafari5,

			/**
			 * 是否是Safari 5.0.x系列浏览器
			 * @type Boolean
			 */
			isSafari5_0 : isSafari5_0,


			/**
			 * 是否是Safari 2.x系列浏览器
			 * @type Boolean
			 */
			isSafari2 : isSafari2,

			/**
			 * 是否是IE浏览器
			 * @type Boolean
			 */
			isIE : isIE,

			/**
			 * 是否是IE6
			 * @type Boolean
			 */
			isIE6 : isIE6,

			/**
			 * 是否是IE 7.x
			 * @type Boolean
			 */
			isIE7 : isIE7,

			/**
			 * 是否是IE 8.x
			 * @type Boolean
			 */
			isIE8 : isIE8,

			/**
			 * 是否是IE 9.x
			 * @type Boolean
			 */
			isIE9 : isIE9,

			/**
			 * 是否是基于 Gecko 引擎的浏览器
			 * @type Boolean
			 */
			isGecko : isGecko,

			/**
			 * 是否是基于 Gecko 1.9+ 引擎的浏览器
			 * @type Boolean
			 */
			isGecko3 : isGecko3,

			/**
			 * 是否是基于 Gecko 2.0+ 引擎的浏览器
			 * @type Boolean
			 */
			isGecko4 : isGecko4,

			/**
			 * 是否是基于 Gecko 5.0+ 引擎的浏览器
			 * @type Boolean
			 */
			isGecko5 : isGecko5,

			/**
			 * 是否是基于 Gecko 5.0+ 引擎的浏览器(例如 Firefox 5.x).
			 * @type Boolean
			 */
			isGecko10 : isGecko10,

			/**
			 * 是否是FireFox 3.0浏览器
			 * @type Boolean
			 */
			isFF3_0 : isFF3_0,

			/**
			 * 是否是FireFox 3.5浏览器
			 * @type Boolean
			 */
			isFF3_5 : isFF3_5,

			/**
			 * 是否是FireFox 3.6浏览器
			 * @type Boolean
			 */
			isFF3_6 : isFF3_6,

			/**
			 * 是否是FireFox 4.0浏览器
			 * @type Boolean
			 */
			isFF4 : 4 <= firefoxVersion && firefoxVersion < 5,

			/**
			 * 是否是FireFox 5浏览器
			 * @type Boolean
			 */
			isFF5 : 5 <= firefoxVersion && firefoxVersion < 6,

			/**
			 * 是否是FireFox 10浏览器
			 * @type Boolean
			 */
			isFF10 : 10 <= firefoxVersion && firefoxVersion < 11,

			/**
			 * 是否是Linux系统
			 * @type Boolean
			 */
			isLinux : isLinux,

			/**
			 * 是否是Windows系统
			 * @type Boolean
			 */
			isWindows : isWindows,

			/**
			 * 是否是Mac OS
			 * @type Boolean
			 */
			isMac : isMac,

			/**
			 * 谷歌浏览器的版本号
			 * @type Number
			 */
			chromeVersion: chromeVersion,

			/**
			 * Firefox浏览器的版本 (非Firefox为0).
			 * @type Number
			 */
			firefoxVersion: firefoxVersion,

			/**
			 * IE版本号
			 * @type Number
			 */
			ieVersion: ieVersion,

			/**
			 * Opera版本号 (非Opera为0).
			 * @type Number
			 */
			operaVersion: operaVersion,

			/**
			 * Safari 版本号(0 if the browser is not Safari).
			 * @type Number
			 */
			safariVersion: safariVersion,

			/**
			 * WebKit版本号 (0 if the browser does not use WebKit).
			 * @type Number
			 */
			webKitVersion: webKitVersion,

			/**
			 * 是否基于SSL访问协议
			 * @type Boolean
			 */
			isSecure: isSecure,
        
			/**
			 * @content 如果接受对象存在提供属性的对象的属性时，将不覆盖
			 * @param {object} obj 接受属性的对象 
			 * @param {object} config 提供属性的对象
			 */
			applyLess: function (obj, config) {
				if (obj && config) {
					for (var i in config) {
						if (typeof obj[i] === 'undefined') {
							obj[i] = config[i];
						}
					}
				}
				return obj;
			},
			/**
			 * @content 返回传入参数的数据类型
			 * @param {mixed} obj 传入的参数
			 * @return {string} string
			 */
			type: function (obj) {
				if (typeof obj === 'undefined' || obj === null) {
					return 'undefined';
				}
				var t = typeof obj;
				if (t === 'object' || t === 'function') {
					switch (t.constructor) {
						case Array:
							return 'array';
						case RegExp:
							return 'regexp';
					}
				}
				return t;
			},
			/**
			 * @content 检查是否为空
			 * @param {mixed} val 检测的值
			 * @param {boolean} allowBlank 允许空字符串为非空
			 * @return {boolean} b
			 */
			isEmpty: function (val, allowBlank) {
				return val === null || val === undefined || (!allowBlank ? true : false);
			},
			/**
			 * @content 检测是否是数组对象
			 * @param {mixed} val
			 * @return {boolean} b
			 */
			isArray: function (val) {
				return val && typeof val.pop === 'function';
			},
			/**
			 * @content 检查是否是number，不是则返回默认的数值，是则返回传递的参数值
			 * @param {mixed} val
			 * @param {number} default 默认返回的值
			 * @return {number}
			 */
			number: function (val, defaultNum) {
				return typeof val === 'number' ? val : defaultNum;
			},
			/**
			 * @content 检测对象是否是Date对象
			 * @param {mixed} val
			 * @return {boolean} b
			 */
			isDate: function (val) {
				return val && typeof val.getTime === 'function';
			},
			/**
			 * @content 获取一个唯一的id
			 * @param {mixed} el 需要生成的id的元素
			 * @param {string} pre id前缀
			 * @return {number} id
			 */
			id: function (el, pre) {
				pre = pre || 'im';
				// to do 获取el对象的dom对象
				// el = Imu.getDom(el);
				var id = pre + (++idSeed);
				return el ? (el.id ? el.id : (el.id = id)) : id;
			},
			/**
			 * @content 遍历整个数组，应用于用户自定义的函数
			 * @param {array} res
			 * @param {function} fn
			 * @param {object} scope
			 */
			each: function(res, fn, scope) {
				if (!Imu.isArray(res)) {
					res = [res];
				}
				var i = 0, len = res.length;
				for (; i < len; i++) {
					if (fn.call(scope || res[i], res[i], i, res) === false) {
						return i;
					}
				}
			},
			/**
			 * @content 将即时方法对象覆盖类中的prototype对象中的方法
			 * @param {object} klass
			 * @param {object} override
			 */
			override: function (klass, override) {
				if (override) {
					var proto = klass.prototype;
					for (var m in override) {
						proto[m] = override[m];
					}
				}
			}
			
		});
})();

